﻿using System;

namespace LightEngine
{
    namespace VisualTools
    {
        namespace Types
        {
            /// <описание класса public class ViewScaling>
            /// Версия класса 1.0
            /// Автор(ы): Ушаков Михаил
            /// Класс предназначен для масштабирования изображения в PictureBox, т.е. задание
            /// отсупов от границ PictureBox, число точек на вид PictureBox.
            /// Элементы класса:
            /// 1. Константы класса:
            /// а) public const Double DividerStepVal = 0.1; константа шага масштабирования по вертикали 
            ///    в долях от высоты изображения.
            /// 2. Поля класса:
            /// а) private Double ScaleDivideValr коэффициент масштабирования по вертикали (1 означает что
            ///    изображение полностью уместилось в PictureBox.
            /// б) private Double LeftMarginVal = 0.05; отсут слева в долях от ширины контейнера изображения
            ///    (PictureBox).
            /// в) private Double RightMarginVal = 0.05; отсут справа в долях от ширины контейнера изображения
            ///    (PictureBox).
            /// г) private Double TopMarginVal = 0.05; отсут сверху в долях от высоты контейнера изображения
            ///    (PictureBox).
            /// д) private Double BottomMarginVal = 0.05; отсут сверху в долях от высоты контейнера изображения
            ///    (PictureBox).
            /// е) private Int16  CanvWidthVal = 0; Ширина холста (контейнера изображения).
            /// ж) private Int16  PointsPerViewVal = 512; Чичло точек рисуемое в одном виде изображения.
            /// 3. Методы класса:
            /// а) public void AdjustImage(UInt16 ImageWidth, Int16 CanvasWidth) определяет 
            ///    отступы и число точек на вид в зависимости от соотношения величин ImageWidth
            ///    и CanvasWidth.
            /// б) public void CalculateNumOfPointsPerView(Int16 CanvasWidth) функция обертка
            ///    вызывает проведения операции вычисления числа точек в виде.
            /// в) private void Calculate() проведение операций вычисления числа точек на вид.
            /// 4. Свойства и индексаторы класса:
            /// а) public Double ScaleDivider свойство для чтения и установки коэффициента 
            ///    масштабирования по вертикали ScaleDivider.
            /// б) public Double LeftMargin свойство для чтения и установки отступа от левого
            ///    края контейнера изображения в долях от ширины контейнера изображения.
            /// в) public Double RightMargin свойство для чтения и установки отступа от правого
            ///    края контейнера изображения в долях от ширины контейнера изображения.
            /// г) public Double TopMargin свойство для чтения и установки отступа от верхнего
            ///    края контейнера изображения в долях от высоты контейнера изображения.
            /// д) public Double BottomMargin свойство для чтения и установки отступа от нижнего
            ///    края контейнера изображения в долях от высоты контейнера изображения.
            /// е) public Int16 PointsPerView свойство для чтения возвращает число точек на вид.
            /// </описание класса public class ViewScaling>
            public class ViewScaling
            {
                public const Double DividerStep = 0.1;

                private Double ScaleDividerVal = 1;
                private Double LeftMarginVal = 0.05;
                private Double RightMarginVal = 0.05;
                private Double TopMarginVal = 0.05;
                private Double BottomMarginVal = 0.05;
                private Int16 CanvWidthVal = 0;
                private Int16 PointsPerViewVal = 512;

                public void AdjustImage(UInt16 ImageWidth, Int16 CanvasWidth)
                {
                    // 1. Предварительный сброс
                    LeftMarginVal = 0.05;
                    RightMarginVal = 0.05;
                    // 2. Вычисление с пятипроцентным отступом слева и справа
                    CalculateNumOfPointsPerView(CanvasWidth);
                    // 3. Настройка отступов
                    if (ImageWidth < PointsPerViewVal)
                    {
                        LeftMargin = ((Double)(ImageWidth - CanvasWidth) / (Double)(2 * CanvasWidth));
                        RightMargin = ((Double)(ImageWidth - CanvasWidth) / (Double)(2 * CanvasWidth));
                    }
                    else
                    {
                        LeftMarginVal = 0.05;
                        RightMarginVal = 0.05;
                    }
                }

                public Double ScaleDivider
                {
                    get { return ScaleDividerVal; }
                    set
                    {
                        if (value < 0)
                            value *= -1;
                        ScaleDividerVal = value;
                    }
                }

                public Double LeftMargin
                {
                    get { return LeftMarginVal; }
                    set
                    {
                        if (value < 0)
                            value *= -1;
                        if (value < 1)
                        {
                            LeftMarginVal = value;
                            Calculate();
                        }
                    }
                }

                public Double RightMargin
                {
                    get { return RightMarginVal; }
                    set
                    {
                        if (value < 0)
                            value *= -1;
                        if (value < 1)
                        {
                            RightMarginVal = value;
                            Calculate();
                        }
                    }
                }

                public Double TopMargin
                {
                    get { return TopMarginVal; }
                    set
                    {
                        if (value < 0)
                            value *= -1;
                        TopMarginVal = value;
                    }
                }

                public Double BottomMargin
                {
                    get { return BottomMarginVal; }
                    set
                    {
                        if (value < 0)
                            value *= -1;
                        BottomMarginVal = value;
                    }
                }

                public Int16 PointsPerView
                {
                    get { return PointsPerViewVal; }
                }

                public void CalculateNumOfPointsPerView(Int16 CanvasWidth)
                {
                    CanvWidthVal = CanvasWidth;
                    Calculate();
                }

                private void Calculate()
                {
                    PointsPerViewVal = (Int16)((Double)(CanvWidthVal) * (1 - LeftMarginVal - RightMarginVal));
                }
            }
        }
    }
}

